//
// Created by win10 on 2024/12/30.
//
#include <stdio.h>

#define MAXSIZE 50     // MAXSIZE为最大数据元素数目

typedef int ElemType;

typedef struct {
    ElemType r[MAXSIZE + 1];  // r[0]闲置或另作它用
    int length;                // 顺序表的当前长度
} SqList;

// 交换两个元素的值
void swap(ElemType *a, ElemType *b) {
    ElemType temp = *a;
    *a = *b;
    *b = temp;
}

// 快速排序的分区操作
int Partition(SqList *L, int low, int high) {
    ElemType pivot = L->r[low];  // 选择第一个元素作为枢轴
    int i = low, j = high;

    while (i < j) {
        // 从右边找到第一个小于枢轴的元素
        while (i < j && L->r[j] >= pivot) j--;
        // 从左边找到第一个大于枢轴的元素
        while (i < j && L->r[i] <= pivot) i++;

        if (i < j) {
            swap(&L->r[i], &L->r[j]);
        }
    }

    // 将枢轴放置到正确的位置
    swap(&L->r[low], &L->r[i]);
    return i;
}

// 快速排序的递归操作
void QuickSort(SqList *L, int low, int high) {
    if (low < high) {
        int pivot = Partition(L, low, high); // 获取枢轴位置
        QuickSort(L, low, pivot - 1);        // 对左半部分递归排序
        QuickSort(L, pivot + 1, high);       // 对右半部分递归排序
    }
}

// 打印顺序表中的元素
void PrintList(SqList *L) {
    for (int i = 1; i <= L->length; i++) {
        printf("%d", L->r[i]);
        if (i < L->length) {
            printf(" ");
        }
    }
    printf("\n");
}

int main() {
    SqList L;

    // 输入数据
    scanf("%d", &L.length);  // 输入顺序表的元素个数
    for (int i = 1; i <= L.length; i++) {
        scanf("%d", &L.r[i]); // 输入顺序表的元素
    }

    // 执行快速排序
    QuickSort(&L, 1, L.length);

    // 输出排序后的顺序表
    PrintList(&L);

    return 0;
}
